package com.itheima.mm.interceptors;

import com.itheima.mm.constant.JwtClaimsConstant;
import com.itheima.mm.context.BaseContext;
import com.itheima.mm.properties.JwtProperties;
import com.itheima.mm.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//拦截器类


@Slf4j//lombok日志注解
@Component//创建当前类对象并放入spring容器中
public class JwtTokenAdminInterceptor implements HandlerInterceptor {
    @Autowired
    private JwtProperties jwtProperties;



    //请求资源（动态资源控制器的方法或静态资源）的拦截，返回true代表放行去执行资源，（不拦截）
    //返回false代表拒绝，直接返回给前端                                       （拦截）
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.判断当前访问的资源是不是处理器方法资源，（就是静态资源），如果不是放行。
        //(handler instanceof HandlerMethod)表示：是不是动态资源
        if(!(handler instanceof HandlerMethod)){
            return true;
        }

        //以下为动态资源（controller方法）处理

        //2.从request中获取token

        String token = request.getHeader(jwtProperties.getAdminTokenName());

        //以下校验token是否合法
        if(token!=null && !"".equals(token)){
            try{
                Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(),token);
                //获取用户Id
                Integer userId = (Integer) claims.get(JwtClaimsConstant.USER_ID);
                //Object userId = claims.get(JwtClaimsConstant.USER_ID);
                log.info("{}用户校验token成功！！！",userId);

                //使用工具类存储当前用户登录的id， 存入内存中
                BaseContext.setCurrentId(userId);

                return true;
            }catch(Exception e){
                e.printStackTrace();
            }
        }


        //来到这里可能token为null或者发生异常token解析不合法
        //否则返回fales
        response.setStatus(401);
        return false;
    }
}
